0

我们在 Python 中知道这一点

a= [1, 2]
b= [a, a]
print b
[[1, 2], [1, 2]]
a.append(3)
print b
[[1, 2, 3], [1, 2, 3]]

这是因为b具有相同列表的引用a并且在其中附加的东西a也会发生变化b
我的问题是——这种行为的用途或优势是什么?
为什么 Python 通过引用分配列表值?
如果我做b =[a,a]得很糟糕,这意味着我对价值观感兴趣,而a不是对a以后发生的事情感兴趣。
我们可以做到这一点

b=[a[:], a[:]] 
#or
b=[a,a]
a=[]

但是为什么这不是python中的默认行为?为什么 Python 是这样设计的!!

4

4 回答 4

5

在 Python 中,一切都是对象。记住这条规则,你不会在任何地方感到困惑。

在上面的例子中,我们可以说

b=[a,a] 

b 的对象现在是一个列表

[object of a,object of a ]

所以对 a 的任何修改都会反映在这里。

证明这一点的一个有趣的例子是我们都知道元组是不可变的,现在;

a=[1,2]

b=(0,a)


a.append(3)

print b # (0,[1,2,3])

太神奇了,元组是如何在这里修改的。答案和上面一样。。

于 2012-09-27T10:23:23.423 回答
1

如果我在做 b =[a,a] 时,这意味着我对 a 的值感兴趣,而不是对 a 以后发生的事情感兴趣。

我不明白为什么这很明显。列表只是一种保存事物的方式。我可能对事物的值感兴趣,但我也可能对事物本身感兴趣——例如,我想将它们传递给一个改变它们的函数。

于 2012-09-27T10:50:17.187 回答
0

Python通过引用分配所有内容。运算符只需将=左侧的名称绑定到右侧的对象。只有在右侧使用可变对象,然后通过调用实例方法(如.append().

于 2012-09-27T10:19:35.960 回答
0

基本上,这是一种语言设计选择。它简化了 Python 的语义,说Python 有名称而不是变量。这样,语义=非常简单:LHS 只是一个新名称,用于引用 RHS。

于 2012-09-27T10:21:16.167 回答