如何在列表内部引用其自身的元素?

1 投票
4 回答
516 浏览
提问于 2025-04-17 22:59

我想知道怎么在一个列表里引用同一个列表中的某个元素。比如说,

settings = ["Exposure", "0", random_time(settings[0])]

这里面的第三个元素要引用第一个元素。我可以直接写“曝光”,但是我想设置成这样:即使第一个元素改变了,第三个元素也能跟着改变。

编辑: 我觉得我之前的问题可能不够清楚。会有多个设置,每个设置都用到一个叫“random_time”的通用函数,所以我需要传递设置的关键字。引用第一个元素是为了让我只需要在一个地方修改代码。这个值在脚本运行后不会再改变。

我会尝试使用一个关键字列表,让设置列表引用这些关键字。

4 个回答

0

正如其他人所说,你选择的写法会在设置还没创建之前就去引用它,所以这样是行不通的(除非设置已经存在,因为之前的某一行给它赋过值)。

更重要的是,在Python中,把一个字符串赋值给两个地方,并不会让你在一个地方改了它,另一个地方也跟着改。这种情况适用于所有的绑定方式,包括变量名、列表和对象的属性。

在Python中,字符串是不可变的——也就是说,它们不能被直接修改,只能重新绑定。而重新绑定只会影响到一个名字(或者列表的位置等等)。这和C语言不同,在C语言中,两个名字可以指向内存中的同一个位置,你可以直接修改那个位置,从而影响到两个地方。

如果你真的需要这样的功能,可以把字符串放在一个对象里(可能是自定义的类)。你甚至可以让这个对象的接口看起来像字符串,除了它不是一个简单的字符串,而是一个有属性(比如contents)绑定到字符串的对象。这样,当你想要改变字符串时,你只需重新绑定这个对象的属性(也就是obj.contents或其他)。因为你并没有重新赋值给对象本身的名字,而只是改变了对象内部的一个名字,所以它会在两个地方都改变。

在这个特定的情况下,你不仅在两个地方有同样的字符串,而是在第一个位置有一个字符串,而在第三个位置有一个对这个字符串进行函数操作后的结果。所以即使你使用了对象包装,它也不会像你想的那样工作,因为每次都需要重新运行这个函数。

有一些方法可以设计你的程序,使得这个问题不再存在,但我不知道你的最终目标是什么,所以无法告诉你具体的方法。

1

你不能直接这样做。

不过,你可以让它们都指向其他东西,然后使用那个东西的一个属性。

class SettingObj:
    name = "Exposure"

settings = [SettingObj, "0", random_time(SettingObj)]

现在,改变一下你处理 settings 列表的方式,去查找列表中第一个和第三个项目的 name 属性。

1

据我所知,你是做不到的。这在大多数编程语言中都是很常见的,因为当你运行你的函数时,那个项目还没有完全创建好。

2

右边的表达式会先被计算,所以当你计算

["Exposure", "0", random_time(settings[0])]

时,变量 settings 还没有定义。

举个简单的例子:

a = 1 + 2

首先计算 1 + 2,结果是 3,计算完后,再进行赋值:

a = 3

你可以通过把“变化”的字符串存储到一个变量来处理这个问题:

var1 = "Exposure"
settings = [var1 , "0", random_time(var1)]

这样在定义列表时是可以工作的,但如果在声明列表 settings 后,你改变了 var1,它的第三个元素就不会改变。如果你想要实现这个效果,可以尝试实现一个类 Settings,这样会灵活很多。

撰写回答