我有一小段代码和一个很大的疑问。为什么Python中这两个变量的值都会改变?
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改变值?我怎样才能解决这个问题?
预先感谢您:)
我有一小段代码和一个很大的疑问。为什么Python中这两个变量的值都会改变?
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改变值?我怎样才能解决这个问题?
预先感谢您:)
在你的第二行,你正在做新的参考送
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
reference count增加1
从蟒蛇docs
(赋值语句在Python中,他们创造的目标和对象之间的绑定不要复制对象)。
提到':'是一个[“切片运算符”](http://stackoverflow.com/questions/509211/pythons-slice-notation) – Blorgbeard
谢谢Vanda。它的工作,但我仍然不明白为什么Python这样做。我认为每个人都会作出不同的参考 – mea
这里引用是相同的两个变量s & S1。因此,如果您修改1,则其他(与第一个相同)将自动进行修改。
因此,您需要使用代码中's'的参数来创建's1'(语法取决于语言)的新实例。
我希望这能回答你的问题。
您遇到的问题是s1=s
未复制。它没有列出新的列表,它只是说“变量s1
应该是指s
的另一种方式。”所以当你修改一个时,你可以通过另一个看到变化。
为避免此问题,请复制s
并将其存储到s1
中。有几种方法可以在Python中执行此操作,并且覆盖了this question and its answers.
您可以在此处使用“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()创建的深度副本是一个新的容器,其中填充了原始对象内容的副本。例如,构建一个新列表,并复制原始列表的元素,然后将这些副本添加到新列表中。
看看你的第二行 – millhouse
你能用你正在使用的语言标记这个问题吗? – Blorgbeard
是的。我想将s的值赋给s1。但我不想修改这两个变量。我只想修改s1并使其保持初始值 – mea