我们在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
中添加了anthing也会更改b
。
我的问题是 - 这种行为的用途或好处是什么?
为什么Python通过引用分配列表值?
如果我在做b =[a,a]
,那么这意味着我对a
的价值观感兴趣,而不是对a
稍后会发生什么感兴趣。
我们可以实现这个目标
b=[a[:], a[:]]
#or
b=[a,a]
a=[]
但为什么这不是python中的默认行为?为什么Python的设计是这样的!!
答案 0 :(得分:5)
在Python中,Everything是一个对象。 记住这条规则&你不会在任何地方感到困惑。
在上面的例子中,我们可以说
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])
太棒了,这里的元组是如何修改的。答案与上述相同..
答案 1 :(得分:1)
如果我正在做b = [a,a],那么这意味着我对后来发生的事情的价值感兴趣。
我不明白为什么这一点显而易见。列表只是一种持有东西的方式。我可能对事物的价值感兴趣,但就像我对事物本身感兴趣一样 - 我想把它们传递给一个改变它们的函数,例如。
答案 2 :(得分:0)
Python通过引用分配所有内容。 =
运算符只是将左侧的名称绑定到右侧的对象。只有在右侧使用可变对象,然后通过调用.append()
之类的实例方法进行变异时,这对大多数人来说才变得明显。
答案 3 :(得分:0)
基本上,它是语言设计的选择。它简化了Python的语义来说Python has names not variables。这样,=
的语义非常简单:LHS只是一个引用RHS的新名称。