为什么Python中两个变量的值都会发生变化?

时间:2014-02-24 08:58:22

标签: python variable-assignment del

我有一小段代码和一个非常大的疑问。

s=['a','+','b']
s1=s
print s1
del s1[1]
print s1
print s

输出

value of s1 ['a', '+', 'b']
value of s1 ['a', 'b']
value of s ['a', 'b']

当我单独修改s1时,为什么变量's'的值会发生变化?我该如何解决这个问题?

提前谢谢你:)

4 个答案:

答案 0 :(得分:4)

在你的第二行,你正在对s

进行新的引用
s1=s

如果您想要使用不同的变量slice operator

s1 = s[:]

<强>输出:

>>> s=['a','+','b']
>>> s1=s[:]
>>> print s1
['a', '+', 'b']
>>> del s1[1]
>>> print s1
['a', 'b']
>>> print s
['a', '+', 'b']

这是你以前做过的事情:

>>> import sys
>>> s=['a','+','b']
>>> sys.getrefcount(s)
2
>>> s1 = s
>>> sys.getrefcount(s)
3

您可以看到s的{​​{3}}增加1

来自python reference count

  

(Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。)。

答案 1 :(得分:3)

您遇到的问题是s1=s无法复制。它没有制作新的列表,它只是说“变量s1应该是引用s的另一种方式。”因此,当您修改一个时,您可以通过另一个看到更改。

要避免此问题,请复制s并将其存储到s1。在Python中有一些方法可以做到这一点,它们在this question and its answers.

中有所涉及

答案 2 :(得分:2)

这里对变量s&amp; s的引用是相同的。 S1。因此,如果您修改1,则其他(与第一个相同)将自动修改。

所以你需要使用代码中's'的参数创建's1'的新实例(语法取决于语言)。

我希望这能回答你的问题。

答案 3 :(得分:0)

您可以在此处使用“deepcopy()”。

>>> s = ['a','+','b']
>>> s1 = s
>>> print s1
['a', '+', 'b']
>>> del s1[1]
>>> print s1
['a', 'b']
>>> print s
['a', 'b']

>>> import copy
>>> s = ['a','+','b']
>>> s1 = copy.deepcopy(s)
>>> print s1
['a', '+', 'b']
>>> del s1[1]
>>> print s1
['a', 'b']
>>> print s
['a', '+', 'b']

deepcopy()创建的深层副本是一个新容器,其中填充了原始对象内容的副本。例如,构造一个新列表并复制原始列表的元素,然后将副本附加到新列表中。