• Python字符串的修改以及传参


    前两天去面试web developer,面试官提出一个问题,用JavaScript或者Python实现字符串反转,我选择了Python,然后写出了代码(错误的):

     1 #!/usr/bin/env python
     2 #-*-coding:utf-8-*-
     3 __author__ = 'ZhangHe'
     4 def reverse(s):
     5     l = 0
     6     r = len(s) - 1
     7     while l < r:
     8         s[l],s[r] = s[r],s[l]
     9         l += 1
    10         r -= 1
    11     return s

    然后面试官问了两个问题:

    (1)可以这样修改字符串的值吗?【我回答的,可以】【回答错误】

    (2)传入的参数是地址?还是副本?【我回答的,传值。数字,字符串,元组传值(immutable);list和dict传引用(mutable);】【回答传值,可以直接修改】【回答错误,正确的是传值,immutable】

    虽然经常使用字符串,但是还真没有研究过这个问题,于是上网搜了一下资料:

    Python中的字符串是不可变类型,就是说改变一个字符串的元素需要新建一个新的字符串。

    字符串是由独立的字符组成的,也是一种序列,序列的通用操作方法也适用于字符串。例如:

    • 通过切片操作顺序地访问子串;
    • 通过len()求字符串的长度等;
    • 通过in或not in操作符判断字符串中是否存在某个字符。


    Python里面没有字符这个类型,而是用长度为1 的字符串来表示这个概念,当然,这其实也是一个子串。

    访问字符串举例:

    1 aString = 'Hello World!'
    2 print(aString[0])
    3 print(aString[1:5])
    4 print(aString[6:])

    输出:
    H
    ello
    World!

    那么如何改变一个字符串呢?

    可以通过给一个变量赋值(或者重赋值)的方式“更新”一个已有的字符串。新的值可能与原有值差不多,也可能跟原有串完全不同。例如:

    1 aString = 'Hello World!'
    2 aString = aString[:6] + 'Python!'
    3 print(aString)
    4 aString = 'different string altogether'
    5 print(aString)

    输出:
    Hello Python!
    different string altogether

    那么如何删除一个字符或字符串呢?

    再重复一遍,字符串是不可变的,所以不能仅仅删除一个字符串里的某个字符,你能做的是清空一个空字符串,或者是把剔除了不需要的部分后的字符串组合起来形成一个新串。

    假设您想要从“Hello World!”里面删除小写的“l”,那么您需要这样做:

    1 aString = 'Hello World!'
    2 aString = aString[:3] + aString[4:]
    3 print(aString)

    输出:
    Helo World!

    通过赋一个空字符串或者使用del 语句来清空或者删除一个字符串。不过,在大部分应用程序里,没有必要显式的删除字符串。定义这个字符串的代码最终会结束,那时Python 会自动释放这些字符串。

    所以,我写的反转字符串代码是有问题的,正确的代码应该是:

     1 #!/usr/bin/env python
     2 #-*-coding:utf-8-*-
     3 __author__ = 'ZhangHe'
     4 def reverse(s):
     5     t = ''
     6     r = len(s) - 1
     7     while r>=0:
     8         t = t + s[r]
     9         r -= 1
    10     return t
    11 s = 'abcd'
    12 print reverse(s)

    那么传入的形参s和实参s到底是不是同一个对象呢?可以用id函数来验证,先来看下id函数的官方解释。

    也就是说,id(obj)函数返回对象obj在其生命周期内位于内存中的地址,id函数的参数类型是一个对象(Python中一切对象,变量中存放的是对象的引用)

    我们可以用下边的代码验证:

     1 #!/usr/bin/env python
     2 #-*-coding:utf-8-*-
     3 __author__ = 'ZhangHe'
     4 def reverse(s):
     5     print id(s)
     6     t = ''
     7     r = len(s) - 1
     8     while r>=0:
     9         t = t + s[r]
    10         r -= 1
    11     return t
    12 s = 'abasdfasdfcdabasdfasdfcd'
    13 print id(s)
    14 print reverse(s)

    输出:

    38264224
    38264224
    dcfdsafdsabadcfdsafdsaba

    可以看出传入的参数实际上是字符串对象的地址,如果把参数换成list或dict,那么输出的id还是一样的,所以所,Python中传参的方式都是传入对象的地址,只不过数字,字符串和tuple是不可直接修改,而list和dict是可以直接修改。

  • 相关阅读:
    Windows 8.1 应用开发 – 触控操作
    Windows Phone App Studio 无码开发手机应用
    尝试HTML + JavaScript 编写Windows App
    Ubuntu远程连接MySQL(connection refused)解决方法
    [MySQL]查看用户权限与GRANT用法
    mysql 创建用户命令-grant
    搭建memcached使用:/usr/bin/phpize 安装memcached扩展的时候报错
    在linux中使用phpize安装php扩展模块
    跟锦数学全部资料
    33套2020数分高代试题参考解答[2020/04/14更新,更多请关注跟锦数学微信公众号]
  • 原文地址:https://www.cnblogs.com/CheeseZH/p/5186916.html
Copyright © 2020-2023  润新知