为什么python通过引用分配列表值

时间:2012-09-27 10:15:22

标签: python list reference

我们在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的设计是这样的!!

4 个答案:

答案 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的新名称。