Python中字符串的修改及传参详解


Posted in Python onNovember 30, 2016

发现问题

最近在面试的时候遇到一个题目,选择用JavaScript或者Python实现字符串反转,我选择了Python,然后写出了代码(错误的):

#!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'ZhangHe'
def reverse(s):
 l = 0
 r = len(s) - 1
 while l < r:
  s[l],s[r] = s[r],s[l]
  l += 1
  r -= 1
 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 会自动释放这些字符串。

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

#!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'ZhangHe'
def reverse(s):
 t = ''
 r = len(s) - 1
 while r>=0:
  t = t + s[r]
  r -= 1
 return t
s = 'abcd'
print reverse(s)

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

Python中字符串的修改及传参详解

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

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

#!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'ZhangHe'
def reverse(s):
 print id(s)
 t = ''
 r = len(s) - 1
 while r>=0:
  t = t + s[r]
  r -= 1
 return t
s = 'abasdfasdfcdabasdfasdfcd'
print id(s)
print reverse(s)

输出:

38264224
38264224
dcfdsafdsabadcfdsafdsaba

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
把大数据数字口语化(python与js)两种实现
Feb 21 Python
python正则表达式抓取成语网站
Nov 20 Python
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 Python
JSON Web Tokens的实现原理
Apr 02 Python
Python数据处理numpy.median的实例讲解
Apr 02 Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 Python
Win8下python3.5.1安装教程
Jul 29 Python
python实现学员管理系统
Feb 26 Python
python学生信息管理系统实现代码
Dec 17 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
Pandas加速代码之避免使用for循环
May 30 Python
pandas求平均数和中位数的方法实例
Aug 04 Python
简单谈谈Python中的闭包
Nov 30 #Python
浅析Python中yield关键词的作用与用法
Nov 29 #Python
Python中 Lambda表达式全面解析
Nov 28 #Python
利用Python抓取行政区划码的方法
Nov 28 #Python
Python抓取手机号归属地信息示例代码
Nov 28 #Python
Python文本相似性计算之编辑距离详解
Nov 28 #Python
Python实现全角半角字符互转的方法
Nov 28 #Python
You might like
CI框架入门之MVC简单示例
2016/11/21 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
详解Vue.directive 自定义指令
2019/03/27 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
2019/02/13 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
人事档案接收函
2014/01/12 职场文书
个人担保书格式范文
2014/05/12 职场文书
消防安全宣传口号
2014/06/10 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
化验室岗位职责
2015/02/14 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
golang正则之命名分组方式
2021/04/25 Golang
利用Redis实现点赞功能的示例代码
2022/06/28 Redis
设置IIS Express并发数
2022/07/07 Servers