【问题标题】:Why does values of both variable change in Python? [duplicate]为什么 Python 中两个变量的值都会发生变化? [复制]
【发布时间】:2014-03-25 20:02:59
【问题描述】:

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

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' 的值会发生变化?我该如何解决这个问题?

提前谢谢你:)

【问题讨论】:

  • 看看你的第二行
  • 你能用你使用的语言标记这个问题吗?
  • 是的。我想将 s 的值分配给 s1。但我不想修改这两个变量。我只想修改s1,让s保持初始值

标签: python variable-assignment del


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      可以看到sreference count增加了1

      来自pythondocs

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

      【讨论】:

      • 提及:"slice operator" 可能会有用
      • 谢谢万达。它起作用了,但我仍然不明白为什么 Python 会这样做。我假设每个人都会做出不同的参考
      【解决方案4】:

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

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

      中有介绍

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多