python-3.x 如何改变字符串中变量的值?

jhdbpxl9  于 2023-04-08  发布在  Python
关注(0)|答案(4)|浏览(144)

我试图简化错误消息,因为在我的项目中,它预计会打印很多错误。我尝试了这个简单的例子,但似乎没有什么工作。
我怎样才能让它重复n次,并打印出出错的位置呢?它总是像n= 1一样打印出来。

n = 1
error = f"Error word {n}"

def test(word):
    if len(word)>5:
        print(error)

ar = ['pizza', 'toasts', 'ham', 'mayo', 'houses']
for word in ar:
    test(word)
    n+=1

我试过了

error = f"Error word {n}"
error = 'Error word '+ str(n)
error = "Error word {n}".format(n)

但也许我没有以正确的方式看待问题?

nqwrtyyt

nqwrtyyt1#

因为n在循环之外。代码一旦执行就不会更新第2行中n上的值。它类似于error = 'Error word 1'

vddsk6oq

vddsk6oq2#

f-strings将在它们在源代码中“看到”的时候使用变量值-之后它们将表现得像普通字符串一样。
对变量进行后期绑定的方法是对字符串使用经典的.format方法,而不是查询字符串:你必须在.format调用中传入要替换的变量作为参数:
在尝试使用format时遇到的问题是,有一些不同的模式可以使用它:只要使用普通的" ... {} ...",中间没有任何东西,将被替换为格式中的第一个位置参数。但是如果你像"{n}"中一样有一个命名变量,你必须在格式调用中传递一个命名参数。
这将工作:

n = 1
error = "Error word {n}"   # without the f-prefix:  a plain string

def test(word):
    if len(word)>5:
 
        print(error.format(n=n))

这里,=之前的n是字符串中显示的名称,位于{n}标记之间。=之后的n是值,在本例中为全局变量n
顺便说一下,这不是一个好的功能设计:你应该把它需要的所有数据作为参数传递给它,而不是依赖n作为全局变量:

def test(word, n):
    if len(word)>5:
        print(error.format(n=n))

ar = ['pizza', 'toasts', 'ham', 'mayo', 'houses']
for word in ar:
    test(word, n)
    n+=1
flvlnr44

flvlnr443#

你的代码不起作用的原因是因为行:

error = f"Error word {n}"

只需要将n的初始值放入字符串中,即1,并且不会随着循环而更新。(换句话说,字符串被卡住为“错误字1”)
下面是更新后的代码:

n = 1
error = "Error word"

def test(word):
    if len(word) > 5:
        print(error, ': ', n)

ar = ['pizza', 'toasts', 'ham', 'mayo', 'houses']
for word in ar:
    test(word)
    n+=1
xmd2e60i

xmd2e60i4#

Python在运行时计算f字符串,在计算时结果是"Error word 1",它被存储为字符串。
您还可以使用enumerate,并将起始值设置为1

ar = ['pizza', 'toasts', 'ham', 'mayo', 'houses']

for n, word in enumerate(ar, 1):
    if len(word) > 5:
        print(f"Error word {n}")

相关问题