我的列表或元组或任何类似数据结构中的变量如何将其更改反映在列表中?

Fri*_*Sky 4 python python-2.7

我不太清楚如何表达它,所以我会证明我的意思.

a = 1
b = 2
my_list = [a,b]
print my_list # [1,2]

a = a + 1
b = b * 2
print a # 2
print b # 4

# prints [1,2] but I want [2,4]
print my_list
Run Code Online (Sandbox Code Playgroud)

这也发生在元组和集合中.我需要什么数据结构?或者我需要什么逻辑?

Mad*_*ist 6

整数是不可变的.这意味着一旦你创建了一个整数对象,例如a = 1,它就永远不会改变.这并不意味着你不能将名称重新绑定a到另一个对象,只是整数对象本身的值不会改变.

执行此操作时a = a + 1,您将创建一个值为2的新整数,并将其指定给a.但原来的1仍然存在.事实上,元素my_list[0]仍然引用原始对象,因为它从未被告知引用其他任何东西.从这个意义上讲,名称就像Python中的指针一样.

要更改列表元素,您有两个选择:

  1. 告诉它明确更改.任何时候修改a,my_list[0] = a再次设置.或者完全放弃a.为什么有两个对同一个对象的引用不需要?你可以做

    my_list[0] += 1
    my_list[1] *= 2
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将可变对象存储在列表中.正如您所见,字符串和整数是不可变的.元组也是如此.但是set,dicts和lists是可变的,因此您对它们所做的任何就地更改都将直接可见.这可能不是您特定情况下的最佳选择,但这是一个示例:

    a = [1]
    b = {2}
    my_list = [a, b]
    a[0] += 1
    a.append(3)
    b.add(4)
    print my_list
    
    Run Code Online (Sandbox Code Playgroud)

    [[2, 3], {2, 4}]
    
    Run Code Online (Sandbox Code Playgroud)

这里显示的两种方法都适用于列表.集合的表示法对于集合略有不同,因为在第一种情况下,您必须删除原始对象并插入新对象.但这个概念是一样的.

但是,只有第二种方法可以使用元组,甚至通常不建议这样做.正如我之前提到的,元组应该是不可变的.当你将一个可变对象(如列表)放入一个元组时,就会产生某些期望,例如可持续性.做到这一点非常好,但你必须要小心一点.

对于您的特定用例(按名称访问值,但也将它们分组到单个数据结构中),字典可能比列表更合适.您可以像列表一样索引字典,除了键可以是您想要的名称而不是基本上任意的索引.您的示例如下所示:

my_dict = {
   'a': 1,
   'b': 2,
}

my_dict['a'] += 1
my_dict['b'] *= 2

print my_dict

<p/>

{'a': 2, 'b': 4}
Run Code Online (Sandbox Code Playgroud)