首页 > 解决方案 > Python 中的引用是什么(特别适用于列表)?

问题描述

我开始学习python,遇到了一些奇怪的事情,想问一下。

下面是代码,我强调了我有疑问的部分功能。

在函数的末尾def add_attraction(destination, attraction)return只写了没有指定它返回的值。但它仍然返回存储在 variable 中的值attractions_for_destination。这怎么可能?

换句话说,我的理解是attractions_for_destination = attractions[destination_index]这段代码将值存储attractions[destination_index]在新创建的attractions_for_destination变量中。并且通过attractions_for_destination.append(attraction),这段代码为新创建的变量添加了更改。但最终改变的是attractions变量。简而言之,添加了更改,attractions_for_destination但我不明白如何attractions更改。

我在互联网上的其他地方问过这个问题,有人帮助我并提到了一些关于参考的事情。我实际上并没有得到它,因为仍然将一个值附加到attractions_for_destination变量而不是attractions变量,但是控制台显示该attractions变量已附加。有人可以为我澄清一下吗?

destinations = ["Paris, France", 
"Shanghai, China", "Los Angeles, USA", "Sao Paulo, Brazil", "Cairo, Egypt"]

test_traveler = ['Erin Wilkes', 'Shanghai, China', ['historical site', 'art']]

#destination index
destination_index = 0
def get_destination_index(destination):
  destination_index = destinations.index(destination)
  return destination_index

#traveler current destination
def get_traveler_location(traveler):
  traveler_destination = traveler[1]
  traveler_destination_index = get_destination_index(traveler_destination)
  return traveler_destination_index

#finding traveler current destination index
test_destination_index = get_traveler_location(test_traveler)

attractions = [[] for destination in destinations]

def add_attraction(destination, attraction):
  try:
    destination_index = get_destination_index(destination)
  except ValueError:
    return 
  ***attractions_for_destination = attractions[destination_index]
  attractions_for_destination.append(attraction)
  return*** 

add_attraction("Los Angeles, USA", ['venice Beach' , ['beach']]) 

print(attractions)

标签: python

解决方案


attractions是列表的列表。

在赋值语句中:

attractions_for_destination = attractions[destination_index]

这会将名称attractions_for_destination与作为列表元素的内部列表之一相关联attractions。也就是说,它不会复制它,而是名称attractions_for_destination现在指的是内存中完全相同的列表对象。因此,当该列表被修改时(在这种情况下,通过调用其append方法),可以看到修改后的值,无论使用哪个列表引用来访问它。特别是,还有一个对同一个列表的引用作为列表的一个元素attractions,所以当你这样做的时候会看到子列表的修改值print(attractions)

您突出显示的两行与简单操作具有相似的整体效果:

    attractions[destination_index].append(attraction)

除了回答直接问题之外,我还要在这段代码中补充一点,让一个列表与另一个列表(在本例中为attractionsand destinations)的顺序相同是数据类型的糟糕选择,最好使用字典。例如:

attractions = dict((destination, []) for destination in destinations)

def add_attraction(destination, attraction):
    try:
        attractions[destination].append(attraction)
    except KeyError:
        return

推荐阅读