Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的列表、元组或任何类似数据结构中的变量如何在列表中反映其更改?_Python_Python 2.7 - Fatal编程技术网

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

Python 我的列表、元组或任何类似数据结构中的变量如何在列表中反映其更改?,python,python-2.7,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 元组和集合也会发生这种情况。我需要什么样的数据结构?或者我需要什么逻辑?整数是不可变的。这意味着一旦您创建了一个整数对象,例如使用a=1,它就永远无法更改。这并不意味着

我还不太清楚该如何表达,所以我将演示我的意思

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

元组和集合也会发生这种情况。我需要什么样的数据结构?或者我需要什么逻辑?

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

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

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

  • 明确地告诉它改变。任何时候修改
    a
    ,请再次设置
    my_list[0]=a
    。或者干脆把
    a
    全部放下。为什么对同一个对象有两个引用,而不需要?你能行

    my_list[0] += 1
    my_list[1] *= 2
    
  • 在列表中存储可变对象。正如您已经看到的,字符串和整数是不可变的。元组也是。但是集合、目录和列表是可变的,所以您对它们所做的任何就地更改都将直接可见。在您的特定情况下,这可能不是最佳选择,但以下是一个示例:

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

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

    不过,只有第二种方法可以处理元组,即使这样,通常也不推荐使用。正如我前面提到的,元组应该是不可变的。随之而来的是一些特定的期望,比如hashability,当您将一个可变对象(如列表)放入元组时,就会违反这些期望。这样做很好,但你得小心一点

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

    my_dict = {
       'a': 1,
       'b': 2,
    }
    
    my_dict['a'] += 1
    my_dict['b'] *= 2
    
    print my_dict
    
    <p/>
    
    {'a': 2, 'b': 4}
    
    my_dict={
    "a":1,,
    “b”:2,
    }
    我的字典['a']+=1
    我的字典['b']*=2
    打印我的字典
    

    {'a':2,'b':4}


    谢谢您的详细回答。“我把这个问题发给一位同事,他建议我改用字典,这样我就可以这样做了。”FridaySky。我在末尾添加了一个注释谢谢您添加了额外的注释,但是当我返回我的_dict.values()时,它没有按预期的顺序显示出来。目前正试图找到解决办法。@Friday。Python 2中没有对字典进行排序。你可以查看如何在SO上获得正确的订单。这已经被问了很多次了,我知道了。我花了一段时间,因为我直到现在才找到这个链接:我一直在用第一种方法,无法让我的字典维持秩序。一定要阅读和理解。
    my_dict = {
       'a': 1,
       'b': 2,
    }
    
    my_dict['a'] += 1
    my_dict['b'] *= 2
    
    print my_dict
    
    <p/>
    
    {'a': 2, 'b': 4}