V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

请各位帮忙看看这个 Python 小程序错在哪里?挺简单的一个。。

  •  
  •   Newyorkcity · 2017-03-05 17:21:43 +08:00 · 1451 次点击
    这是一个创建于 2620 天前的主题,其中的信息可能已经有所发展或是发生改变。
    def upper_lower(Str):
        for i,c in enumerate(Str):
            print("i=%d,c=%c"%(i,c))
            if i == 0:
                c = c.upper()
                print(c)
            # else:
            #     c = c.lower()
            #     print(c)
        
        return Str
    
    Li = ['adam', 'LISA', 'barT']
    print(upper_lower(Li[0]));
    

    主要是输出让我感觉比较奇诡

    i=0,c=a
    A #既然已经改成了 A
    i=1,c=d
    i=2,c=a
    i=3,c=m
    adam #为什么输出的时候却没变呢?
    

    谢谢

    第 1 条附言  ·  2017-03-05 18:08:52 +08:00
    谢谢各位,已经解决。
    12 条回复    2017-03-05 18:52:15 +08:00
    sagaxu
        1
    sagaxu  
       2017-03-05 17:25:48 +08:00
    >>> a=1
    >>> b=a
    >>> a,b
    (1, 1)
    >>> b=2
    >>> a,b
    (1, 2)


    为什么 a 没有变成 2?
    SuperMild
        2
    SuperMild  
       2017-03-05 17:31:17 +08:00   ❤️ 1
    仔细看看代码,你改变了 c 的值,然后打印 c ,这就是变成 A 的原因。

    但是 Str 的值没有改变呀,哪一句代码改变了 Str 的值?因此, Str 不变。
    Biwood
        3
    Biwood  
       2017-03-05 17:33:13 +08:00
    不怎么会 python ,不过大概知道原因

    把 c = c.upper() 这一句改成 Str[i] = c.upper() 就行了
    arnofeng
        4
    arnofeng  
       2017-03-05 17:44:40 +08:00
    你的 Str 在自定义函数里完全没被修改嘛
    welkinzh
        5
    welkinzh  
       2017-03-05 17:50:55 +08:00 via Android
    因为你没改变原列表呀 你只改变了 c
    grimpil
        6
    grimpil  
       2017-03-05 18:03:58 +08:00 via Android
    @Biwood Python 好像不能直接修改 str 中指定 index 的值
    Dvel
        7
    Dvel  
       2017-03-05 18:12:50 +08:00   ❤️ 1
    楼主应该就是想实现 capitalize()这个函数的功能吧。
    就是首字母大写,其余小写, 按照楼主的思路可以这样:
    def my_capitalize(aStr):
    for i, c in enumerate(aStr[:]):
    if i == 0:
    aStr = c.upper()
    else:
    aStr += c.lower()
    return aStr

    简单的可以这样:
    s = 'adam'
    print(s[0].upper() + s[1:].lower())
    Newyorkcity
        8
    Newyorkcity  
    OP
       2017-03-05 18:14:12 +08:00
    @SuperMild
    我这么理解可以吗?
    如果用 C 语言的说法来理解,就相当于 c 只是指向一个新的存储空间,它不断的从 str 中遍历,取得值后保存在自己的内存空间。所以修改 c 的值不影响 str 本身。
    谢谢
    Newyorkcity
        9
    Newyorkcity  
    OP
       2017-03-05 18:21:38 +08:00
    @Dvel
    for i, c in enumerate(aStr[:]):
    这里的这个切片有什么玄机吗?
    不然的话第一个判断里
    aStr = c.upper()
    如果传入的是 adam
    那这么一弄 aStr 不就变成了['a']了么。。怎么还能进行下去
    Rice
        10
    Rice  
       2017-03-05 18:48:39 +08:00 via iPhone
    因为字符串是不可变的。
    bxb100
        11
    bxb100  
       2017-03-05 18:50:46 +08:00 via Android
    😂怪奇葩的,你想改变 Str 偏偏你没传递,再说 python 里面有 str.capitalize()方法啊
    Dvel
        12
    Dvel  
       2017-03-05 18:52:15 +08:00
    @Newyorkcity #9 这个我也不懂,感觉遍历时有修改删除的话,弄个副本安全点吧。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   6297 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:30 · PVG 10:30 · LAX 19:30 · JFK 22:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.