我有一小段代码和一个非常大的疑问。
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'的值会发生变化?我该如何解决这个问题?
提前谢谢你:)
答案 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()创建的深层副本是一个新容器,其中填充了原始对象内容的副本。例如,构造一个新列表并复制原始列表的元素,然后将副本附加到新列表中。