需要检查我所有的变量是否有一个符号,我把变量放在一个列表中并使用 for 循环检查,但是 Python 只改变列表中的值
Need to check all my variables for an ampersand, I put variables in a list and check using a for loop, but Python only changes value inside list
我有下面的代码,但不幸的是它只改变了列表中的值。有什么办法可以更改列表外的值,以便稍后在脚本中使用它吗?
street_number = "100 & 102"
street_name = "Fake Street"
suburb = "Faketown"
allvariables = [street_number, street_name, suburb]
ampersand = "&"
ampersand_escape = "&"
for i, item in enumerate(allvariables):
if isinstance(item, str):
if ampersand in item:
allvariables[i] = item.replace(ampersand,ampersand_escape)
print(allvariables) # -> ['100 & 102', 'Fake Street', 'Faketown']
print(street_number) # -> 100 & 102
我能想到的唯一选择是单独检查每个变量,但我有很多变量需要检查,所以这将永远花费:
if ampersand in street_number:
street_number.replace(ampersand,ampersand_escape)
if ampersand in street_name:
street_name.replace(ampersand,ampersand_escape)
if ampersand in suburb:
suburb.replace(ampersand,ampersand_escape)
但这似乎非常耗时。预先感谢您的帮助!
P.S。以防万一-除了符号
之外,我还需要再做一些检查
看起来你所有的变量都是相互关联的,所以使用字典来存储变量可能是个好主意。与列表一样,您可以查看它,但与列表不同的是,您可以为其成员命名。下面是一些示例代码:
address = {
"street_number": "100 & 102",
"street_name": "Fake Street",
"suburb": "Faketown",
}
ampersand = "&"
ampersand_escape = "&"
for (item, value) in address.items():
if isinstance(value, str):
if ampersand in value:
address[item] = value.replace(ampersand,ampersand_escape)
print(address)
python 中的每个变量(例如,street_number
)只是对某物的引用。在这种情况下,street_number
是对字符串的引用,即“100 & 102”。
当您编写 allvariables = [street_number, street_name, suburb]
时,您只是在创建一个包含已由变量初始化的元素的列表。所以在你的列表中,位置 0 包含一个字符串,它是从 street_number
复制的并且具有相同的值“100 & 102”,但是没有与变量 street_number
.
的持续链接
因此,如果您将 allvariables[0]
更新为 '100 & 102',这将不会影响变量 street_number
引用的值。
获得我认为您想要的结果的一种方法是:
street_number = "100 & 102"
street_name = "Fake Street"
suburb = "Faketown"
allvariableNames = ['street_number', 'street_name', 'suburb']
ampersand = "&"
ampersand_escape = "&"
ampIndices = [i for i, item in enumerate(allvariableNames) if isinstance(eval(item), str) and ampersand in eval(item)]
for i in ampIndices:
exec(f'{allvariableNames[i]} = {allvariableNames[i]}.replace(ampersand, ampersand_escape)')
print(', '.join(f"'{eval(item)}'" for item in allvariableNames)) # -> ['100 & 102', 'Fake Street', 'Faketown']
print(street_number)
输出:
'100 & 102', 'Fake Street', 'Faketown'
100 & 102
解释:
- 不要使用您想到的变量来初始化列表,而是使用这些变量的名称作为字符串来初始化列表
- 为变量值(使用
eval()
函数获得)构建一个索引列表到变量名称列表中包含搜索模式
- 使用
exec()
执行python语句,该语句使用变量的字符串名称通过用新字符串替换搜索模式来更新变量的值&
Python 中的字符串是不可变的,这意味着它们一旦创建就无法更改。只能创建一个新字符串。所以你要做的是将新创建的字符串存储回同一个变量中。
例如
s = "hello"
s.upper() #does not change s.. only creates a new string and discards it
s = s.upper() # creates the new string but then overrides the value of s
此外,将字符串添加到列表意味着您所做的任何操作都不会影响原始字符串。
我有下面的代码,但不幸的是它只改变了列表中的值。有什么办法可以更改列表外的值,以便稍后在脚本中使用它吗?
street_number = "100 & 102"
street_name = "Fake Street"
suburb = "Faketown"
allvariables = [street_number, street_name, suburb]
ampersand = "&"
ampersand_escape = "&"
for i, item in enumerate(allvariables):
if isinstance(item, str):
if ampersand in item:
allvariables[i] = item.replace(ampersand,ampersand_escape)
print(allvariables) # -> ['100 & 102', 'Fake Street', 'Faketown']
print(street_number) # -> 100 & 102
我能想到的唯一选择是单独检查每个变量,但我有很多变量需要检查,所以这将永远花费:
if ampersand in street_number:
street_number.replace(ampersand,ampersand_escape)
if ampersand in street_name:
street_name.replace(ampersand,ampersand_escape)
if ampersand in suburb:
suburb.replace(ampersand,ampersand_escape)
但这似乎非常耗时。预先感谢您的帮助!
P.S。以防万一-除了符号
之外,我还需要再做一些检查看起来你所有的变量都是相互关联的,所以使用字典来存储变量可能是个好主意。与列表一样,您可以查看它,但与列表不同的是,您可以为其成员命名。下面是一些示例代码:
address = {
"street_number": "100 & 102",
"street_name": "Fake Street",
"suburb": "Faketown",
}
ampersand = "&"
ampersand_escape = "&"
for (item, value) in address.items():
if isinstance(value, str):
if ampersand in value:
address[item] = value.replace(ampersand,ampersand_escape)
print(address)
python 中的每个变量(例如,street_number
)只是对某物的引用。在这种情况下,street_number
是对字符串的引用,即“100 & 102”。
当您编写 allvariables = [street_number, street_name, suburb]
时,您只是在创建一个包含已由变量初始化的元素的列表。所以在你的列表中,位置 0 包含一个字符串,它是从 street_number
复制的并且具有相同的值“100 & 102”,但是没有与变量 street_number
.
因此,如果您将 allvariables[0]
更新为 '100 & 102',这将不会影响变量 street_number
引用的值。
获得我认为您想要的结果的一种方法是:
street_number = "100 & 102"
street_name = "Fake Street"
suburb = "Faketown"
allvariableNames = ['street_number', 'street_name', 'suburb']
ampersand = "&"
ampersand_escape = "&"
ampIndices = [i for i, item in enumerate(allvariableNames) if isinstance(eval(item), str) and ampersand in eval(item)]
for i in ampIndices:
exec(f'{allvariableNames[i]} = {allvariableNames[i]}.replace(ampersand, ampersand_escape)')
print(', '.join(f"'{eval(item)}'" for item in allvariableNames)) # -> ['100 & 102', 'Fake Street', 'Faketown']
print(street_number)
输出:
'100 & 102', 'Fake Street', 'Faketown'
100 & 102
解释:
- 不要使用您想到的变量来初始化列表,而是使用这些变量的名称作为字符串来初始化列表
- 为变量值(使用
eval()
函数获得)构建一个索引列表到变量名称列表中包含搜索模式 - 使用
exec()
执行python语句,该语句使用变量的字符串名称通过用新字符串替换搜索模式来更新变量的值&
Python 中的字符串是不可变的,这意味着它们一旦创建就无法更改。只能创建一个新字符串。所以你要做的是将新创建的字符串存储回同一个变量中。 例如
s = "hello"
s.upper() #does not change s.. only creates a new string and discards it
s = s.upper() # creates the new string but then overrides the value of s
此外,将字符串添加到列表意味着您所做的任何操作都不会影响原始字符串。