我有以下代码:
secretWord = 'hello'
letter = 'l'
tag = '_ '*len(secretWord) # tag = '_ _ _ _ _'
for m in rage(len(secretWord)):
if letter == secretWord[m] and m == 0:
tag.replace(tag[m],letter)
else:
tag.replace(tag[m+2],letter)
我想要的输出是tag = '_ _ l l _'
出于某种原因,即使我的逻辑完全准确,我根本无法使其工作。我有一个for循环遍历secretWord中的每个字符,如果letter在那个时候在for循环中等于那个特定字符,用该字母替换tag中的适当位置并保持所有其他空格('_')相同。
答案 0 :(得分:3)
字符串在Python中是不可变的,您无法修改它们。这就是您的tag
未更新的原因。
Python有一个非常奇怪但有用的数据模型。有些类型是可变的(例如列表和字典),有些类型是不可变的(例如字符串和数字)。
字符串实例的replace()
函数(实际上所有其他字符串函数)都不能修改字符串。相反,它返回原始字符串的新修改版本。
python和非托管编程语言(如C / C ++)之间的一个更大区别是python变量总是引用值,而C / C ++变量是值的实际存储。
奇怪的是,当从python开始时,这可以在某种程度上被忽略,因为某些算法的语法是相同的。类似的东西:
a = 7
a += 35
s = "Hello"
s += " World"
在Python和C / C ++中产生a = 42
和s = "Hello World"
。这对于C / C ++来说很明显,但是在python中会发生一些完全不明显的事情。
在python中s
首先引用字符串"Hello"
(不是:s
包含字符串"Hello"
)。然后将字符串Hello
和字符串World
连接起来,然后重置引用s
以指向新字符串"Hello World"
。
接下来就是a = b
总是意味着:复制引用。它永远不会复制该值。对于字符串和整数,它在实践中没有太大的区别,但对于更复杂的类型,它确实如此。但现在这可能超过了这个问题。
答案 1 :(得分:1)
让tag
成为已知或空白字符的列表。
在需要时使用' '.join(tag)
制作显示的表格。
secretWord = 'hello'
letter = 'l'
tag = ['_']*len(secretWord)
tag = [(letter if m == letter else t) for m, t in zip(secretWord, tag)]
print(' '.join(tag))
# _ _ l l _
以下是一些解释此解决方案中使用的工具的链接:
[expr for variable in iterable]
是list
comprehension。letter if m == letter else t
是conditional expression。zip
用于将secretWord
中的字母与中的字母配对
tag
。' '.join
用于将字母列表合并为一个字母
每个字母之间留有空格的字符串。