【问题标题】:Python change objects in a list inplacePython就地更改列表中的对象
【发布时间】:2015-04-30 09:40:04
【问题描述】:

这可能没有多大意义,但我想更改以下内容以显示 'x' 而不是 'a'

>>> a = "a"
>>> b = "b"
>>> c = "c"
>>> d = [a, b, c]
>>> d[0] = "x"
>>> a
'a'

是否有可能以某种方式出现这种行为?不仅适用于字符串,也适用于其他对象。

【问题讨论】:

  • 对 Python 本身没有重大改变。字符串是不可变的,因此根据定义不能就地更改。推荐阅读:nedbatchelder.com/text/names.html
  • 正如@jonrsharpe 所说,python 文字(数字/字符串)是不可变的,只有像 object/list 这样的复杂类型是可变的,
  • @number5 这不太准确:complex is a numeric type... 也有可变和不可变的映射和序列。
  • @jonrsharpe 这与可变性有什么关系?您可以为变量分配另一个值吗?这正是我想做的,它只是对对象的引用在列表中
  • 你是什么意思“为什么会起作用”?!因为您分别更改了d[0] a请阅读 Ned Batchelder 的文章,希望能消除您对 Python 分配工作方式的困惑。跨度>

标签: python


【解决方案1】:

字符串在 Python 中是故意不可变的。

您的选择是将字符串存储在可变容器中,或者使用其他一些可变的数据类型。

此示例将每个字符串存储在一个可变容器中(您自己的类或另一个列表,例如)。

a = ["a"]
b = ["b"]
c = ["c"]
d = [a, b, c]
d[0][0] = "x"
a = d[0][0]
print(a)

将打印"x"

但在这种情况下,bytearray 可能是更好的选择。

a = bytearray(b'abc')
a[2] = ord(b'x')
a = chr(a[2])
print(a)

也会打印“x”。

【讨论】:

    【解决方案2】:

    不,你不能,因为当你分配l=[a,b,c] 时,你把a 的值放在l 中,而不是a

    竖琴最接近的东西:

    class ref:
        value=0
        def __init__(self,x):
            self.value=x
        def __repr__(self):
            return repr(self.value)
    
    a=ref('a')
    b=ref('b')
    c=ref('c') 
    l=[a,b,c]
    l[0].value='x'
    print(a)
    >>>> 'x'
    

    【讨论】:

    • 谢谢,看来你是少数读过其他对象部分的人之一
    • 这不正确,repr 必须返回一个字符串。 (不确定)
    • value=0 是干什么用的?这似乎是一个错误。
    【解决方案3】:

    您实际上正在做的是将 a、b 和 c 作为引用传递给 d[]。 d 然后引用这些字符串而不是变量。

    它不关心 a、b 或 c 等于什么。您在 cmets 中举了一个例子,但它实际上在像这样运行时不起作用:

    >>> a = "a"
    >>> b = "b"
    >>> c = "c"
    >>> d = [a, b, c]
    >>> a = "x"
    >>> a
    'x'
    >>> d
    ['a', 'b', 'c']
    >>> c = 12
    >>> c
    12
    >>> d
    ['a', 'b', 'c']
    

    【讨论】:

      【解决方案4】:

      变量是对象的标签。

      d 是标签列表。

      a 是对象的标签。 'a' 是一个不可变对象。如果您想将a 更改为显示'x',则必须更改它所指向的内容:

      >>> a = 'x'
      >>> a
      'x'
      

      或者:

      >>> a = d[0]
      >>> a
      'x'
      

      【讨论】:

        【解决方案5】:

        ax

        a = "a"
        b = "b"
        c = "c"
        d =[a,b,c]
        d[0] = "x"
        a = d[0]
        print a
        

        输出为x

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-06
          • 1970-01-01
          • 2017-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-07
          相关资源
          最近更新 更多