从最近的SO问题(参见在python中创建一个由列表索引的字典)我意识到我可能对python中可散列和不可变对象的含义有一个错误的概念.
我从url传递的值为:
user_data = {}
if (request.args.get('title')) :
user_data['title'] =request.args.get('title')
if(request.args.get('limit')) :
user_data['limit'] = request.args.get('limit')
Run Code Online (Sandbox Code Playgroud)
然后用它作为
if 'limit' in user_data :
limit = user_data['limit']
conditions['id'] = {'id':1}
int(limit)
print type(limit)
data = db.entry.find(conditions).limit(limit)
Run Code Online (Sandbox Code Playgroud)
它打印: <type 'unicode'>
但我不断收到type的limit是unicode,从查询产生一个错误!我正在将unicode转换为int,但为什么不转换?请帮忙!!!
说我想创建一个类car,tractor和boat.所有这些类都有一个实例,engine我想跟踪单个列表中的所有引擎.如果我正确理解电机对象是否可变,我可以将其存储为列表中的属性car以及相同的实例.
我无法找到关于用户定义的类是否可变的任何可靠信息,以及在定义它们时是否有选择可以选择,是否有人可以解释一下?
这些变量赋值按我的预期工作:
>>> a = 3
>>> b = a
>>> print(a, b)
(3, 3)
>>> b=4
>>> print(a, b)
(3, 4)
Run Code Online (Sandbox Code Playgroud)
但是,这些分配的行为有所不同:
>>> class number():
... def __init__(self, name, number):
... self.name = name
... self.number = number
...
>>> c = number("one", 1)
>>> d = c
>>> print(c.number, d.number)
(1, 1)
>>> d.number = 2
>>> print(c.number, d.number)
(2, 2)
Run Code Online (Sandbox Code Playgroud)
与示例不同,为什么是c相同的?如何在类示例中执行类似的操作?也就是说,复制对象,然后更改它的一部分(这不会影响我借用属性的对象)?d(a, b)(a, b)(c, d)
有什么区别
list = range(100)
Run Code Online (Sandbox Code Playgroud)
和
list[:] = range(100)
Run Code Online (Sandbox Code Playgroud)
在Python?
编辑
我应该已经提到过,在分配列表变量已经分配给列表之前:
list = [1, 2, 3]
list = range(100)
Run Code Online (Sandbox Code Playgroud)
要么
list = [1, 2, 3]
list[:] = range(100)
Run Code Online (Sandbox Code Playgroud) 我理解Python中可变对象和不可变对象之间的区别.我读了许多讨论差异的帖子.但是,我没有读过任何关于WHY整数是不可变对象的内容.
这有什么原因吗?或者答案是"它就是这样"?
编辑:我被提示将此问题与其他问题"区分",因为它似乎是一个先前提出的问题.但是,我相信我所要求的更多的是一个哲学上的Python问题,而不是一个技术性的Python问题.
似乎Python中的"原始"对象(即字符串,布尔值,数字等)是不可变的.我还注意到由基元(即dicts,列表,类)组成的派生数据类型是可变的.
无论对象是否可变,是否绘制线的位置?原始vs派生?
我想我已经开始理解python了,但是我仍然遇到一个基本问题.什么时候用copy.copy?
>>>a=5
>>>b=a
>>>a=6
>>>print b
5
Run Code Online (Sandbox Code Playgroud)
好有意义.但在什么情况下说b=aa和b之间形成某种"链接",以便修改a会修改b?这是我没有得到的copy.copy- 每次使用等号将一个变量分配给另一个变量时,只需复制该值吗?
初步说明:我在朱莉娅工作,但这个问题可能适用于许多语言.
设置:我有一个复合类型如下:
type MyType
x::Vector{String}
end
Run Code Online (Sandbox Code Playgroud)
我写了一些方法来采取行动MyType.例如,我编写了一个允许我插入新元素的方法x,例如function insert!(d::MyType, itemToInsert::String).
问题:应该MyType是可变的还是一成不变的?
我的理解:我已经阅读了关于这个的Julia文档,以及关于Stackoverflow的更一般(和高度投票)的问题(例如这里或这里),但我仍然没有很好地处理它意味着什么从实际角度看可变/不可变(特别是对于不可变复合类型的情况,包含可变类型的可变数组!)
尽管如此,这是我的尝试:如果MyType是不可变的,那么这意味着该字段x必须始终指向同一个对象.该对象本身(字符串的向量)是可变的,因此我可以在其中插入新元素.我不允许做的是尝试改变,MyType以便该字段x指向一个完全不同的对象.例如,执行以下操作的方法是可以的:
MyType.x[1] = "NewValue"
push!(MyType.x, "NewElementToAdd")
Run Code Online (Sandbox Code Playgroud)
但是执行以下操作的方法并不合适:
MyType.x = ["a", "different", "string", "array"]
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?另外,是否认为不可变类型字段值被锁定的对象是在构造函数中创建的对象?
最后一点:如果这似乎与SO上的其他问题重复,我道歉.如上所述,我已经仔细研究过,并且无法理解我所追求的.
我不记得是哪一次谈话,但最近我看了一些来自CppCon 2017的演讲,并且有人提到了某种旁注,唯一真正的重载方式是以operator=下列方式:
class test {
public:
test& operator=(const test&) &;
};
Run Code Online (Sandbox Code Playgroud)
他明确强调了尾随&但没有说明它做了什么.
那它是做什么的?
tl; dr Python重用ID吗?两个具有非重叠生命期的对象获得相同ID的可能性有多大?
背景:
我一直在研究一个复杂的项目,纯粹用Python 3编写.我一直在看测试中的一些问题,并花了很多时间寻找根本原因.经过一些分析后,我怀疑当测试作为一个整体运行时(它由一个专门的调度程序编排并运行),它会重用一些模拟方法,而不是用原始方法实现新对象.检查翻译是否重复使用我id().
问题:
id()通常可以工作并显示对象标识符,并让我告诉我的调用何时创建新实例而不重用.但是如果两个对象相同的话,会发生什么?文件说:
返回对象的"标识".这是一个整数,在该生命周期内保证该对象是唯一且恒定的.具有非重叠寿命的两个对象可以具有相同的
id()值.
问题:
解释器id()什么时候可以重用值?是在它随机选择相同的内存区域时吗?如果它只是随机的,似乎极不可能,但它仍然无法保证.
有没有其他方法来检查我实际引用的对象是什么?我遇到了一个我有对象的情况,它有一个模拟的方法.该对象不再使用,垃圾收集器将其销毁.我创建相同类的新对象后,就得到了一个新的id(),但该方法得到了相同的ID,当它被嘲笑为,它实际上是只是一个模拟.
有没有办法强制Python销毁给定的对象实例?从阅读中我看来没有,并且当它看不到对象的引用时它取决于垃圾收集器,但我认为无论如何都值得问.
python ×8
immutability ×4
mutable ×3
python-2.7 ×2
python-3.x ×2
c++ ×1
c++11 ×1
casting ×1
class ×1
hash ×1
julia ×1
list ×1
memory ×1
object ×1
unicode ×1
unit-testing ×1
variables ×1