嘿,我是python开发的新手,因为我是新手,所以我充满了许多怀疑。假装
s = 'something'
for something in s:
something = something + 1
print something
我知道这里有什么作为索引,它会在s中打印出整个元素。
并在
s = 'something'
for something in s:
s[something] = s[something] + 1
print something
我不明白代码第二部分的正确含义..是否可能在python中? “
对不起低等级的问题,任何帮助将不胜感激..
答案 0 :(得分:3)
当你循环遍历这样的字符串时:
for c in 'something':
print(c)
c
不作为索引,它充当字符串的字符,因此输出将为:
s
o
m
e
t
h
i
n
g
如果你想循环索引,你可以这样做:
s = 'something'
for i in range(len(s)):
print(i)
输出结果为:
0
1
2
3
4
5
6
7
8
您可以通过索引来访问字符串中的字符:
s = 'something'
for i in range(len(s)):
print(s[i])
输出结果如下:
s
o
m
e
t
h
i
n
g
如果你想循环一个字符串以便获得字符和索引,你可以使用enumerate()
函数:
s = 'something'
for i, c in enumerate(s):
print(i, c)
输出:
0 s
1 o
2 m
3 e
4 t
5 h
6 i
7 n
8 g
请注意,字符串是不可变的,因此您无法更改它们:
>>> s = 'something'
>>> s[0] = 'a'
TypeError: 'str' object does not support item assignment
当您进行字符串连接时,实际上并没有更改字符串,而是创建一个新字符串。
编辑1
字符串具有可以调用它们来执行某些任务的方法,例如.split()
方法:
>>> s = 'something'
>>> s.split('e')
['som', 'thing']
他们也有一些特殊的方法,如__getitem__
。以下两个是等效的:
>>> s = 'something'
>>> s[0]
's'
>>> s.__getitem__(0)
's'
列表等其他序列是可变的,因此它们也有__setitem__
方法:
>>> s = ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']
>>> s[0] = 't'
>>> s
['t', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']
>>> s.__setitem__(0, 's')
>>> s
['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']
编辑2
当您尝试执行此操作时会发生这种情况s[something] = s[something] + 1
:
>>> s = 'something'
>>> s[0] = s[0] + 1
TypeError: Can't convert 'int' object to str implicitly
发生这种情况的原因是因为s[0]
是's'
所以你试图在字符串中添加一个数字,这没有任何意义。然后,如果您尝试执行s[something] = s[something] + 'a'
,您将获得TypeError
,因为字符串是不可变的:
>>> s = 'something'
>>> s[0] = s[0] + 'a'
TypeError: 'str' object does not support item assignment
这肯定不起作用:
>>> s = 'something'
>>> s['a']
TypeError: string indices must be integers
答案 1 :(得分:0)
变量名后面的方括号根据上下文调用变量__getitem__
或__setitem__
。例如,x[i] = x[i] + 1
相当于x.__setitem__(i, x.__getitem__(i) + 1)
。您可以在此处的文档中阅读相关内容:
https://docs.python.org/2/reference/datamodel.html
有几种内置类型可以实现其中的一个或两个,例如字符串,元组,列表和字典。对于序列类型(字符串,元组,列表),正在访问或设置的“项目”是一个索引,因此例如print 'hello'[0]
将打印h
,因为您在第一个索引处获取该字符列表。
在这种情况下,看起来第二段代码实际上会导致错误,因为字符串不可变。这意味着无法修改字符串对象,因此它们不会被__setitem__
实现,s[something] = s[something] + 1
将失败。这可以使用像list或dict这样的可变类型,例如:
s = [1, 1, 1]
s[0] = s[0] + 1
# s is now [2, 1, 1]
答案 2 :(得分:0)
s[something] = s[something] + 1
不应该工作;字符串值是不可变的。
s += "foo"
之类的语法实际上会从s + "foo"
创建一个新的字符串值,然后将其分配给s
,释放原始值s
以进行垃圾回收。
要记住Python中所有变量的一个关键要素是它们只是对值的引用。不能保证这些值不会在某处汇集,并且具有写时复制语义。另一个例子是类似x = 5
之类的内容并不会x
设置为5
,它会创建(或以其他方式获取)值5
并设置x
引用它。
在大多数情况下,这种区别并不重要。一般来说,Right Thing(TM)会发生。
代码:
s = 'something'
for something in s:
# ...
将s
视为一个字符列表,并通过循环将something
按顺序设置到每个字符。 (这与JavaScript不同。)如果您想要索引而不仅仅是字符,请使用:
s = 'something'
for i, something in enumerate(s):
# ...
所以s [something] = s [something] + 1在任何情况下都不可能..正确吗?
它适用于列表(例如[1, 2, 3]
)和字典(例如{"a": 1, "b": 2}
)。只是不是为了字符串。
如果你只想获得一个字符串,其中每个字符都被下一个字符替换,首先用字符串理解来分割字符串:
l = [c for c in s]
用下一个字符替换每个字符:
l2 = [chr(ord(c) + 1) for c in l]
将它们粘合在一起形成一个新的字符串:
s2 = ''.join(l2)
全部放在一起:
s = 'something'
s2 = ''.join([chr(ord(c) + 1) for c in s])