6

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

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

4 回答 4

8

在您的第二行中,您正在对 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了 1

来自 python文档

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

于 2014-02-24T09:03:03.290 回答
4

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

为避免此问题,请制作一份副本s并将其存储到s1. 在 Python 中有几种方法可以做到这一点,这些方法都包含在这个问题及其答案中。

于 2014-02-24T09:10:04.687 回答
2

这里变量 s 和 s1 的引用是相同的。因此,如果您修改 1 那么 other (与第一个相同)将自动被修改。

因此,您需要在代码中使用“s”的参数创建“s1”的新实例(语法取决于语言)。

于 2014-02-24T09:02:55.750 回答
1

您可以在此处使用“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() 创建的深层副本是一个新容器,其中填充了原始对象内容的副本。例如,构造一个新列表并复制原始列表的元素,然后将副本附加到新列表中。

于 2014-02-24T10:00:46.110 回答