Python не имеет переменных. У него есть имена. Все имена указывают на объект.
Атрибуция указывает имя на объект. Это так просто. Вы не можете заставить атрибуцию генерировать новый объект.
a = x
b = a # means the name "b" also refers to x - regardless if x is mutable or not
Нет, вы не можете сделать изменяемые объекты неизменными таким образом - если кто-то получит ссылку на изменяемый объект, который они могут изменить, и все ссылки на тот же объект будут затронуты.
Просто потому, что объект неизменен, не делает объекты с одинаковым значением одинаковыми автоматически - попробуйте следующее:
>>> x = 'foo bar'
>>> y = ' '.join(['foo', 'bar'])
>>> x == y
True
>>> x is y
False
>>> id(x), id(y)
(139789175899936, 139789175899984)
Как вы можете видеть, это два разных неизменяемых объекта с одинаковым значением! Оба существуют отдельно в памяти!
Чтобы сделать их хешируемыми, возможно - вам нужно определить метод __hash__
, который возвращает некоторый уникальный хеш, который сравнивает равный, когда объекты равны - фактически по умолчанию все объекты уже возвращают id как хэш, поэтому вы можете просто обернуть класс:
class HashableContainer:
def __init__(self, obj):
self._obj = obj
l = [] # mutable, no hash
ic = HashableContainer(l) # mutable, but hashable
d = {}
d[ic] = 'test' # can be used as key
Однако есть оговорка - если вы создаете новый HashableContainer
с тем же контентом, он будет считаться другой объект - потому что он будет иметь другой хеш (на основе его id)
Ниже кода, который я написал, чтобы сделать это. Это работает в моей системе.
foreach ($mbx in Get-Mailbox -ResultSize unlimited) {
Get-MailboxFolderStatistics -Identity $mbx | Where-Object { Ниже кода, который я написал, чтобы сделать это. Это работает в моей системе.
[110] Вместо того, чтобы сначала назначать все объекты почтового ящика переменной, используется оператор foreach с Get-Mailbox в нем. Когда вы начнете администрировать систему Exchange с тысячами почтовых ящиков, вы поймете, почему это лучше
.FolderType -eq 'Calendar'} | ForEach-Object {
$path = "$($MBX.Alias):$( Ниже кода, который я написал, чтобы сделать это. Это работает в моей системе.
[110] Вместо того, чтобы сначала назначать все объекты почтового ящика переменной, используется оператор foreach с Get-Mailbox в нем. Когда вы начнете администрировать систему Exchange с тысячами почтовых ящиков, вы поймете, почему это лучше
.Folderpath)".Replace('/','\')
$DefaultPermission = Get-MailboxFolderPermission -Identity $path -User Default
if ($DefaultPermission.AccessRights -notcontains 'PublishingEditor') {
Set-MailboxFolderPermission -Identity $path -AccessRights PublishingEditor -User Default
}
else {
Write-Host 'Already Done'
}
}
}
Вместо того, чтобы сначала назначать все объекты почтового ящика переменной, используется оператор foreach с Get-Mailbox в нем. Когда вы начнете администрировать систему Exchange с тысячами почтовых ящиков, вы поймете, почему это лучше