“我思故我在”——赋值是个大问题

上中学的时候学到笛卡尔是唯心论者,还知道他有一句名言“我思故我在”,但当时并不知道“我思故我在”不是一句唯心的理论——其本意是“我无法否认自己的存在,因为当我否认、怀疑时,我就已经存在”。换句话说,思考要以思考者的存在为前提,因此“能够思考”就已经确立了“我”的存在。

在python语言里,创建一个名为a的变量非常容易,既不需要规定a的类型,也不用限定a的命名空间,只要简单的写“a=表达式”就可以了。但是这个很方便的特性到了“一行python实现功能”这个命题下,还是不够方便——python不像c可以把赋值过程当成一个表达式,也就是说,如果写“(a=10,a)[1]",不会返回10,而是会爆出一个”invalid syntax“错误。python变量,现在既要你”思“,更要你”在“,这便如何是好捏?

首先想到的是利用函数,比如”>>> (lambda x,y,z:(x,y,z))(3,5,7)[2]“在函数内部相当于给3、5、7命名为x、y、z,但是这要求在一开始就规定好所有的变量,而且也不利于版本变更。

于是又找到了2个威力巨大的函数,一个是globals()另一个是__setitem__()——前者可以返回全局作用域的”命名空间对象“(这个提法有问题,不过我实在找不出刚好的描述方式,见谅),后者可以为任何对象增加命名属性。这样就可以用以下方式增加一个全局变量”a“:

 

>>> globals().__setitem__('a',10)
>>> a
10
>>>(globals().__setitem__('a',10),a)[1]
10
>>>

如果在函数里用locals()代替globals(),可以让变量仅存在当前函数,避免”污染“全局变量,效果会更好。但是这样做总归是要生成一堆变量影响还是有点大,有没有其他选择呢?

答案当然是”有“,方法也很简单,就是既不使用globals(),也不使用locals(),而是结合函数法定义一个自己的变量专门用于存储:

>>> (lambda x:(x.__setitem__('myVar',10),x['myVar'])) ({})[1]
10
>>>

当然,如果你喜欢的话,可以用“x.__getitem__('myVar')"的形式来代替”x['myVar']“,还可以在用完myVar之后,使用x.pop(‘myVar’,None)的方式清理掉'myVar‘这个变量。

说到清理,还有一种更变态的方式,就是用[]代替{},这样就不存在变量名了,你需要自己记住各个位置上的变量是干嘛用的,比较适合自定义堆栈使用。胡乱写了几行在下面,很凌乱,请大家将就着看吧。

>>>(lambda x:(x.insert(0,10),x[0],x.__getitem__(0),x.pop(0))) ([])[1:]
(10, 10, 10)
>>>

“一行python写功能”的”顺序结构“到这里就暂告一段落了,下次博主会来讨论”选择结构“,欢迎没吐够的童鞋继续来参加这个眩晕折腾之旅……

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值