python - 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)
解决方案
attractions
是列表的列表。
在赋值语句中:
attractions_for_destination = attractions[destination_index]
这会将名称attractions_for_destination
与作为列表元素的内部列表之一相关联attractions
。也就是说,它不会复制它,而是名称attractions_for_destination
现在指的是内存中完全相同的列表对象。因此,当该列表被修改时(在这种情况下,通过调用其append
方法),可以看到修改后的值,无论使用哪个列表引用来访问它。特别是,还有一个对同一个列表的引用作为列表的一个元素attractions
,所以当你这样做的时候会看到子列表的修改值print(attractions)
。
您突出显示的两行与简单操作具有相似的整体效果:
attractions[destination_index].append(attraction)
除了回答直接问题之外,我还要在这段代码中补充一点,让一个列表与另一个列表(在本例中为attractions
and destinations
)的顺序相同是数据类型的糟糕选择,最好使用字典。例如:
attractions = dict((destination, []) for destination in destinations)
def add_attraction(destination, attraction):
try:
attractions[destination].append(attraction)
except KeyError:
return
推荐阅读
- flutter - 颤振:我得到了这个异常:闭包调用参数不匹配:
- python - Strava REST API | swagger-client 不返回完整的DetailedAthelete reperesentation
- javascript - 在数组中映射数组
- javascript - Vue - 将数组作为参数传递
- c# - 为什么在 .NET 5 中指定循环枚举值时枚举的顺序很重要?
- php - 用户/浏览器是否可以看到服务器端的 PHP curl 请求
- python - 如何将列表分隔到不同的表格并将表格打印到reportlab中的各个页面pdf?
- node.js - Type-graphql,Mikoorm 查询返回 Ref
而不是用户 - docker - 本地主机窗口 10 中的 Docker 连接被拒绝
- javascript - Javascript地图问题返回一个空值的数组